package hanoi.tower;



import java.util.List;
import search.*;
import es.deusto.ingenieria.is.Hanoi.formulation.Soporte;
import es.deusto.ingenieria.is.search.formulation.Operator;
import es.deusto.ingenieria.is.search.formulation.State;


public class MoverFicha extends Operator {
	private Torre torreOrigen;
	private Torre torreDestino;

	public MoverFicha(Torre torreOrigen, Torre torreDestino) {
		this.torreDestino=torreDestino;
		this.torreOrigen=torreOrigen;
		this.setName("Mover de "+this.torreOrigen.getPosicion()+" a "+this.torreDestino.getPosicion());
	}
	

	public boolean IsApplicable(State state){
		 
			TorreHanoiState estado=(TorreHanoiState)state;
			int tOrigen=this.torreOrigen.getPosicion()-1;
			int tDestino=this.torreDestino.getPosicion()-1;
			
			Torre torreOrigen = (Torre) estado.getvTorres().get(tOrigen);
			Torre torreObjetivo = (Torre) estado.getvTorres().get(tDestino);
			
			
			if(torreOrigen.getTorreFichas().isEmpty())
				return false;
			else{
				if(torreObjetivo.getTorreFichas().isEmpty())
					return true;
				else{
					Ficha dOrigen=torreOrigen.getTorreFichas().pop();
					Ficha dDestino=torreObjetivo.getTorreFichas().pop();
					if(dOrigen.getTamano() < dDestino.getTamano()){
						torreOrigen.getTorreFichas().push(dOrigen);
						torreObjetivo.getTorreFichas().push(dDestino);
						return true;
					}else{
						torreOrigen.getTorreFichas().push(dOrigen);
						torreObjetivo.getTorreFichas().push(dDestino);
						return false;
					}
				}
			}
		}
	
	
	public State Effect(State st){
		TorreHanoiState newThs = (TorreHanoiState)((TorreHanoiState) st).clone();
		
		Torre TorreOrigen=(Torre) newThs.getvTorres().get(newThs.getTorreOrigen());
		Torre TorreDestino=(Torre) newThs.getvTorres().get(newThs.getTorreObjetivo());
		Ficha forigen=(Ficha) TorreOrigen.getTorre().get(TorreOrigen.nfichas-1);
		TorreOrigen.getTorre().remove(TorreOrigen.nfichas-1);
		TorreOrigen.nfichas= TorreOrigen.nfichas-1;
		TorreDestino.torre.add(TorreDestino.getNfichas(), forigen);
		TorreDestino.nfichas= TorreDestino.nfichas+1;
		List l= newThs.getvTorres();
		l.set(newThs.getTorreOrigen(),TorreOrigen);
		l.set(newThs.getTorreObjetivo(),TorreDestino);
		
		return st;
	}
	
}


